<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>函数柯里化</title>
</head>
<body>
    <p>柯里化：把接收多个参数的函数变换成一连串接收一个单一参数的函数（单一参数为多个参数中的第一个）</p>
    <p>函数柯里化思想：一个JS预处理的思想，降低通用性，提高适用性</p> 
    <p>
    特点：<br/>
        参数复用	需要输入多个参数，最终只需输入一个，其余通过arguments来获取<br/>
        提前返回	避免重复去判断某一条件是否符合，不符合则return 不再继续执行下面的操作<br/>
        延迟执行	避免重复的去执行程序，等真正需要结果的时候再执行<br/>
    </p>

    <p>
        高阶函数：如果一个函数符合下面两个规范中的任何一个，那该函数就是高阶函数：<br/>
            1. 若A函数，接收的参数是一个函数，那么A就可称之为高阶函数；<br/>
            2. 若A函数，调用的返回值依然是一个函数，那么A也可称之为高阶函数。<br/>

        函数柯里化：通过函数调用继续返回函数的方式，实现多次接收参数最后统一处理的函数编码形式<br/>
    </p>
    <script>
        add = function(a) {
            return function (b) {
                return function (c) {
                    return a + b + c
                }
            }
        }

        console.log(add(1)(2)(3))


        // 一个实用的例子，要求写一个函数，单独改变info中username、password的值
        const info = {
            'username': '',
            password: ''
        }
        // ======= 正常情况，写两个函数 =========
        changeUsername = val => info.username = val
        changePassword = val => info.password = val
        // 然后分别调用
        changeUsername('demo')
        changePassword('1234')
        console.log('normal:', info)

        // ======= 使用函数柯里化 =========
        changeInfo = dataType => {
            return val => {
                info[dataType] = val
            }
        }
        // 第一个参数区分属性
        changeInfo('username')('lxd')
        changeInfo('password')('456')
        console.log('currying:', info)

    </script>
</body>
</html>